package api

import (
	"fmt"
	"strings"
)

var (
	Func1 = func(n1 int, n2 int) int {
		return n1 * n2
	}
)

func init() {
	fmt.Println("api模块初始化成功……")
}

func Welcome() {
	fmt.Println("陈文小超欢迎您来到今日的golang语言学习……")
}

// 定义函数类型
type myFunc func(int, int) int

func Access() {
	result := testFunc(getSum, 10, 20)
	fmt.Printf("result=%v\n", result)
	fmt.Println("----------")
	a, b := getSumAndSub(10, 20)
	fmt.Printf("a=%v,b=%v\n", a, b)
	fmt.Println("------------")
	res1 := sum(1, 2, 3, 4, 5, 6, 100)
	fmt.Printf("res1=%v\n", res1)
	fmt.Println("------------")
	m1 := 10
	m2 := 20
	swap(&m1, &m2)
	fmt.Println("------------")
	res3 := nickFunc(10, 20)
	fmt.Printf("res3=%v\n", res3)
	fmt.Println("------------")

	// 全局匿名函数
	res4 := Func1(100, 2)
	fmt.Printf("res4=%v", res4)

	// 调用闭包
	res5 := addUpper()
	fmt.Printf("1=%v\n", res5(1))
	fmt.Printf("2=%v\n", res5(2))
	fmt.Printf("3=%v\n", res5(3))

	// 测试闭包使用案例
	res6 := fileSuffer("jpg")
	fmt.Printf("res6=%v\n", res6("venki.chen"))
}

// defer 释放资源
func deferTest(n1 int, n2 int) (result int) {
	defer fmt.Printf("n1=%v\n", n1)
	defer fmt.Printf("n2=%v\n", n2)
	result = n1 + n2

	return
}

// 闭包实践案例
func fileSuffer(suffix string) func(string) string {
	return func(s string) string {
		if !strings.HasSuffix(s, suffix) {
			return s + "." + suffix
		}

		return s
	}
}

// 闭包 计数器
func addUpper() func(int) int {
	var n int = 10 // 匿名函数引用到函数外的n，因此这个匿名函数就和n形成一个整体，构造闭包。
	return func(x int) int {
		n += x
		return n
	}
}

// 匿名函数
func nickFunc(n1 int, n2 int) int {
	result := func(n1 int, n2 int) int {
		return n1 + n2
	}(n1, n2)

	return result
}

// 交换两个变量的值
func swap(n1 *int, n2 *int) {
	*n1 = *n1 + *n2
	*n2 = *n1 - *n2
	*n1 = *n1 - *n2

	fmt.Printf("n1=%v,n2=%v\n", *n1, *n2)
}

func testFunc(funvar myFunc, n1 int, n2 int) int {
	return funvar(n1, n2)
}

func getSum(n1 int, n2 int) int {
	return n1 + n2
}

func getSumAndSub(n1 int, n2 int) (sum int, sub int) {
	sub = n1 - n2 // 注意不是这样的 :=
	sum = n1 + n2

	return
}

// 求出1到多个值之和
func sum(n1 int, args ...int) int {
	sum := n1
	for i := 0; i < len(args); i++ {
		sum += args[i]
	}

	return sum
}
